#ifndef MULTICASTSENDER_H
#define MULTICASTSENDER_H

#include "common.h"

#include <QObject>
#include <string>
#include <netinet/in.h>

/**
 * @class MulticastSender
 * @brief 负责发送组播消息的类
 *
 * 此类用于初始化发送套接字，并将消息发送到指定的组播地址和端口。
 */
class MulticastSender : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param groupAddr 组播地址
     * @param groupPort 组播端口
     * @param parent 父对象
     */
    MulticastSender(const std::string& groupAddr, u16 groupPort, QObject* parent = nullptr);

    /**
     * @brief 析构函数
     *
     * 关闭套接字，释放资源。
     */
    ~MulticastSender();

    /**
     * @brief 初始化发送套接字
     * @param localInterface 本地网络接口名称
     * @return 初始化是否成功
     *
     * 创建 UDP 套接字，设置组播相关选项（如 TTL、回环等），并绑定到指定的网络接口。
     */
    bool initSocket(const std::string& localInterface);    // 初始化发送套接字

public slots:
    /**
     * @brief 发送组播消息
     * @param message 要发送的消息
     * @return 发送是否成功
     *
     * 将消息发送到预先设定的组播地址和端口。
     */
    bool sendToMulticastGroup(const std::string& message); // 发送组播消息

private:
    /**
     * @brief 获取指定网络接口的 IP 地址
     * @param interface 网络接口名称
     * @return 接口的 IP 地址字符串，失败返回空字符串
     *
     * 使用 ioctl 系统调用获取网络接口的 IP 地址。
     */
    std::string getInterfaceIP(const std::string& interface);

private:
    s32                sockfd_;          ///< 套接字描述符
    std::string        groupAddr_;       ///< 组播地址
    u16                groupPort_;       ///< 组播端口
    struct sockaddr_in serverAddr_;      ///< 组播服务器地址结构
};

#endif // MULTICASTSENDER_H
